package com.topvision.myviewtest.kotlin.part2

/**
 *
 * @author lucy
 * @date 2018-06-04 17:45
 * @description //基本类型
 */

fun main(args: Array<String>) {
    // 数字(可用下划线分割)
    val a = 1_000_000
    val b: Int = 100

    // 隐式转换
    val byte: Byte = 1
//    val c:Int = byte // 错误

    // 显示转换
    val c = byte.toInt() // 正确
    /*
    toByte(): Byte
    toShort(): Short
    toInt(): Int
    toLong(): Long
    toFloat(): Float
    toDouble(): Double
    toChar(): Char
    */

    val s = (1 shl 2) and 0x00FF00FF // ??? 看不懂

    /*
    shl(bits) – 有符号左移 (Java 的 << )
    shr(bits) – 有符号右移 (Java 的 >> )
    ushr(bits) – 无符号右移 (Java 的 >>> )
    and(bits) – 位与
    or(bits) – 位或
    xor(bits) – 位异或
    inv() – 位非
    */

    println(s)

    // 原始字符串: 内部没有转义并且可以包含换行和任何其他字符
    val str1 = """
        for(c in "foo"){
            print(c)
        }
        a = $a
        """
    println(str1)

    // 默认 | 用作边界前缀 , 通过 trimMargin() 函数去除前导空格
    val text = """
        |Tell me and I forget.
        |Teach me and I remember.
        |Involve me and I learn.
        |(Benjamin Franklin)
    """.trimMargin()

    println(text)
    // out:
    //     Tell me and I forget.
    //     Teach me and I remember.
    //     Involve me and I learn.
    //     (Benjamin Franklin)


    // if表达式
    val max = max(100, 200)
    println(max)

    useWhen1(2)
    useWhen2(10)
    useWhen3(3)
    useWhen3(13)
    useWhen4(10)
    useIs("a")
    useIs(1)
}

fun max(num1: Int, num2: Int): Int {
    // if 的分支可以是代码块，最后的表达式作为该块的值
    return if (num1 > num2) {
        println("num1 = $num1")
        num1
    } else {
        println("num2 = $num2")
        num2
    }
}

fun useWhen1(x: Int) {
    // 多个常量作为分支条件
    when (x) {
        0, 1 -> println("x is 0 or 1")
        else -> println("x is not 0 or 1")
    }
}

fun useWhen2(x: Int) {
    // 定义内部函数
    fun parseX(x: Int): Boolean = x == 10
    // 使用函数作为分支条件
    when {
        parseX(x) -> println("x is 10")
        else -> println("x is not 10")
    }
}

fun useWhen3(x: Int) {
    val validNumber = 10..20
    when (x) {
        in 1..10 -> println("x = $x is range 1 -> 10")
        !in 5..10 -> println("x = $x is not range 5 -> 10")
        in validNumber -> println("x = $x is range 10 -> 20")
        else -> println("x = $x is not value")
    }
}

fun useWhen4(x: Int) {
    fun isOdd(x: Int): Boolean = x == 10
    fun isTen(x: Int): Boolean = x == 10
    // when不带参数，分支条件作为布尔表达式(只会输出第一个为真的值)
    when {
        isOdd(x) -> println("x == $x")
        isTen(x) -> println("x = $x")
        else -> println("x = $x is not value")
    }
    // out: x == 10
}

fun useIs(x: Any): Boolean {
    return when (x) {
    // 判断是否是String类型用 is 非用 !is
        is String -> {
            println("x is String")
            true
        }
        else -> {
            println("x is not String")
            false
        }
    }
}